package com.webserver.http;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * 请求对象，该类的每一个实例用于标识HTTP协议规定的请求内容
 * 一个请求由三部分构成:
 * 1:请求行
 * 2:消息头
 * 3:消息正文
 */
public class HttpServletRequest {

    // 请求方式
    private Socket socket;
    // 请求方式
    private String method;
    // 抽象路径
    private String uri;
    // 消息头的相关信息
    private String protocol;

    // 消息头的相关信息
    private Map<String, String> headers = new HashMap<>();

    public HttpServletRequest(Socket socket) throws IOException {
        this.socket = socket;
        //1解析请求行
        parseRequestLine();
        //2解析消息头
        parseHeaders();
        //3解析消息正文
        parseContent();

    }

    // 解析请求行
    private void parseRequestLine() throws IOException{
        String line = readLine();
        System.out.println("请求行内容："+line);
        String[] data = line.split("\\s");
        method = data[0];
        uri = data[1];
        protocol = data[2];
        System.out.println("method:"+method);
        System.out.println("uri:"+uri);
        System.out.println("protocol:"+protocol);
    }

    // 解析请求头
    private void parseHeaders() throws IOException{
        while (true) {
            String line = readLine();
            // 如果读取的消息头是空字符串，说明单独读取到了CRLF
            if (line.isEmpty()){
                break;
            }
            System.out.println("消息头："+line);
            // 将消息头按照":"拆分名字和值并作为key，value存入到header中
            String[] data = line.split(":\\s");
            headers.put(data[0],data[1]);
        }
        System.out.println("headers:"+headers);
    }

    // 解析消息正文
    private void parseContent(){

    }

    private String readLine() throws IOException{
        // 调用同一个socket对象若干次getInstance()方法返回的始终是同一条输入流
        InputStream in = socket.getInputStream();
        StringBuilder builder = new StringBuilder();
        char pre = 'a', cur = 'a';
        int d;
        while ((d = in.read())!=-1){
            //本次读取到的字符
            cur = (char)d;
            if(pre==13&&cur==10){
                break;
            }
            builder.append(cur);
            pre = cur;
        }
        return builder.toString().trim();
    }

    public Socket getSocket() {
        return socket;
    }

    public String getUri() {
        return uri;
    }

    public String getProtocol() {
        return protocol;
    }

    public Map<String, String> getHeaders() {
        return headers;
    }
}
